#include "systick.h"
#include "stm32f10x.h" 


void SysTick_Delay_Nms(uint32_t Nms)
{
	SysTick->CTRL=0;                                 // 关闭SysTick定时器，确保初始状态干净
	SysTick->LOAD=Nms*9000;                          // 加载计数初值：9MHz时钟下，1ms需计数9000次
	SysTick->CTRL=SysTick_CLK_REF|SysTick_ENABLE;    // 配置时钟源为外部参考时钟，并使能定时器
	// 等待计数完成：检测CTRL寄存器的第16位
	while(!(SysTick->CTRL&(1<<16)));
	SysTick->CTRL=0;                                 // 关闭定时器
	SysTick->VAL=0;                                  // 清除当前计数值，避免影响下次使用
	
}


void SysTick_Delay_Nus(uint32_t Nus)
{
	SysTick->CTRL=0;                                 // 关闭SysTick定时器，确保初始状态干净
	SysTick->LOAD=Nus*72;                            // 加载计数初值：72MHz时钟下，1us需计数72次
	SysTick->CTRL=0x05;                              // 0x05 = 外部参考时钟
	// 等待计数完成：检测CTRL寄存器的第16位
	while(!(SysTick->CTRL&(1<<16)));
	SysTick->CTRL=0;                                 // 关闭定时器
	SysTick->VAL=0;                                  // 清除当前计数值，避免影响下次使用
	
}
// 全局变量：用于记录系统运行的毫秒数，volatile确保编译器不优化该变量
volatile uint32_t g_systick_ms = 0;


void SysTick_Handler(void) {
    g_systick_ms++;  // 1ms节拍累加
}


// 初始化1ms节拍SysTick（AHB/8：72MHz/8=9MHz，每ms装载9000-1）
void SysTick_Init(void)
{
	SysTick->CTRL = 0;                              // 关闭定时器，初始化控制寄存器
	SysTick->LOAD = 9000 - 1;                       // 加载1ms对应的计数初值
	SysTick->VAL  = 0;                              // 清除当前计数值
	SysTick->CTRL = SysTick_CLK_REF | SysTick_INT | SysTick_ENABLE; // 使能中断与计数
}

uint32_t SysTick_Millis(void)
{
	return g_systick_ms;                            // 返回全局毫秒计数变量的值
}

